package com.example.programmerinterview;

/**
 * 面试题 01.05. 一次编辑
 * 字符串有三种编辑操作:插入一个字符、删除一个字符或者替换一个字符。 给定两个字符串，编写一个函数判定它们是否只需要一次(或者零次)编辑。
 * 示例 1:
 * <p>
 * 输入:
 * first = "pale"
 * second = "ple"
 * 输出: True
 * <p>
 * 思路：因为只有一次操作的机会，所以无论如何剩余的元素摆放是完全相等的。
 */
public class OneEditAway {

    public boolean oneEditAway(String first, String second) {

        int f = first.length();
        int s = second.length();

        if (Math.abs(f - s) > 1) return false;
        if (first.equals(second)) return true;

        int count = 0;    // 记录不匹配的次数。
        int i = 0, j = 0; // 用来指向两字符串的指针
        while (i < f && j < s) {
            // 两个字符串从前往后开始遍历，如果当前两字符串字符相同就继续比较下一个。
            if (first.charAt(i++) == second.charAt(j++)) {
                continue;
            }
            count++;
            if (count > 1) return false;
            if (f != s) { // 若不相等，则将短字符串指针前移一位，使两个字符串剩余长度相等
                if (f > s) j--;
                else i--;
            }
        }
        return true;
    }

}

